/*
 * Datos.java
 *
 * Created on 15 de noviembre de 2001, 10:54
 */

package DatosEntrada;

import java.util.*;

public abstract class DatosDiscretos {
    private static int nObjetivos;
    private static int nAlternativas;
    private static Object[][] tablaObjetivos;
    private static Object[][] tablaPagos;
    private static Object[][] tablaPagosNoModif;
    private static InterfacesDiscretas.PlataformaDiscreta Padre; 
    private static InterfacesGenerales.Plataforma Padre2; 
    
    private static Vector  col;
    private static Vector  val;
    private static Vector  desc;
    
    public static void initDatos(InterfacesDiscretas.PlataformaDiscreta parent,InterfacesGenerales.Plataforma parent2 ,Object[][] tablaObjetivo, Object[][] tablaPago, Vector c, Vector v, Vector d, boolean yaVerifico) {
        col = c;
        val = v;
        desc = d;
        Padre = parent;
        Padre2=parent2;
        nObjetivos = tablaObjetivo.length;
        nAlternativas = tablaPago.length;
        tablaPagosNoModif=tablaPago;
        tablaPagos = new Object[tablaPago.length][tablaPago[0].length];
        for (int i = 0; i < tablaPago.length; i++)
            for (int j = 0; j < tablaPago[0].length; j++)
                tablaPagos[i][j] = tablaPago[i][j];
        tablaObjetivos=tablaObjetivo; 
        modificaTablaPagos();
        minimizar();
        if(yaVerifico==false)
            verificarDominancia();
    }
    
    private static void modificaTablaPagos() {
        //System.out.println("size vector: "+col.size());
        for (int k = 0; k < col.size(); k++) {
            for (int i = 0; i < nAlternativas; i++) {
                int colAux=Integer.parseInt(col.get(k).toString());
                double[] valorAux=(double[]) val.get(k);
                String[] descripAux=(String[])desc.get(k);
                int m=valorAux.length;
                for (int j = 0; j < m; j++) {
                    if (tablaPagosNoModif[i][colAux].equals(descripAux[j])) {
                            tablaPagos[i][colAux] = (""+valorAux[j]);
                    }
                }
            }
        }
    }  
    
    private static void minimizar() {
        double[][] matrizPagos = new double[nAlternativas][nObjetivos];
        for(int i = 0; i < nAlternativas; i++)
            for(int j = 0; j < nObjetivos; j++)
            {
                double valor = Double.parseDouble(tablaPagos[i][j+1].toString());
                matrizPagos[i][j] = valor;
            }
        for(int i=0;i<nObjetivos;i++){
            if(tablaObjetivos[i][3].equals("Minimizar")){
                for(int j=0;j<nAlternativas;j++){
                 matrizPagos[j][i]=(-1)*matrizPagos[j][i];
                }
            }
        }
        for(int i = 0; i < nAlternativas; i++)
            for(int j = 0; j < nObjetivos; j++)
            {
                tablaPagos[i][j+1] = new Double(matrizPagos[i][j]).toString();
            }
    }
    
    private static void verificarDominancia() {
        int contP = 0;
        int contN = 0;
        int[] dominancia = new int[nAlternativas];
        String [] nombresAlt = new String[nAlternativas];
        for (int h = 0; h < nAlternativas; h++)
        {
              nombresAlt[h] = tablaPagos[h][0].toString();
        }
        for (int i = 0; i < nAlternativas; i++) {
            for (int k = i+1; k < nAlternativas; k++) {
                for (int j = 1; j < nObjetivos + 1; j++) {
                    String valor1 = tablaPagos[i][j].toString();
                    String valor2 = tablaPagos[k][j].toString();
                    double val1 = Double.parseDouble(valor1);
                    double val2 = Double.parseDouble(valor2);
                    if(val1 >= val2)
                        contP++;
                    if(val1 <= val2)
                        contN++;
                }
                if (contP == nObjetivos && contP >= contN)
                    dominancia[k] = 1;
                if (contN == nObjetivos && contN > contP)
                    dominancia[i] = 1;
                contP = contN = 0;
            }
        }
        int cont = 0;
        for (int i = 0; i < nAlternativas; i++) {
            if (dominancia[i] == 1)
                cont++;
        }
        //System.out.println("Alt Dom en DaDiscretos: "+cont); 
        if (cont > 0) {
            InterfacesDiscretas.AltDominadas Dom = new InterfacesDiscretas.AltDominadas(Padre,Padre2, true, dominancia, nombresAlt);
            Dom.show();
        }
    }
    
    public static int getNumeroObj() {
        return nObjetivos;
    }
    
    public static int getNumeroAlt() {
        return nAlternativas;
    }
    
    public static String[] getNombresObj() {
        String[] nombresObj = new String[nObjetivos];
        for (int i = 0; i < nObjetivos; i++)
        {
            nombresObj[i] = (String) tablaObjetivos[i][0];
        }
        
        return nombresObj;
    }
    
    public static String[] getUnidades() {
        String[] nombresUnid = new String[nObjetivos];
        for (int i = 0; i < nObjetivos; i++)
        {
            nombresUnid[i] = (String) tablaObjetivos[i][2];
        }
        
        return nombresUnid;
    }
    
    
    public static String[] getNombresAlt() {
        
        String [] nombresAlt = new String[nAlternativas];
        for (int i = 0; i < nAlternativas; i++)
        {
            nombresAlt[i] = (String) tablaPagos[i][0];
        }
        
        return nombresAlt;
    }
    public static double[][] getMatrizPago() {
        double[][] matrizPagos = new double[nAlternativas][nObjetivos];
        for(int i = 0; i < nAlternativas; i++)
            for(int j = 0; j < nObjetivos; j++)
            {
                double valor = Double.parseDouble(tablaPagos[i][j+1].toString());
                matrizPagos[i][j] = valor;
            }
        return matrizPagos;
    }
    
    public static Object[][] getMatrizPagoNoModificada() {
        
        Object[][] matrizPagosNoMod = new Object[nAlternativas][nObjetivos];
        for(int i = 0; i < nAlternativas; i++)
            for(int j = 0; j < nObjetivos; j++)
            {
                matrizPagosNoMod[i][j] = tablaPagosNoModif[i][j+1];
            }   
        return matrizPagosNoMod ;
    }
    
    public static double[] getPesos() {
        double[] pesos = new double[nObjetivos];
        for (int i = 0; i < nObjetivos; i++)
        {
            double valor = Double.parseDouble(tablaObjetivos[i][4].toString());
            pesos[i] = valor;
        }
        return pesos;
    }
}